package com.example.staff.hub.dao.impl;

import com.example.staff.hub.dao.IStaffDao;
import com.example.staff.hub.entity.Staff;

import java.io.*;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

/**
 * 员工数据访问对象实现类
 */
public class StaffDaoImpl implements IStaffDao {

    /**
     * 数据库文件
     */
    private File database = new File(System.getProperty("user.home") + "/database/staff.csv");

    public StaffDaoImpl() {
        // 获取数据库文件的父目录
        File parentDirectory = database.getParentFile();
        // 检查父目录是否存在，如果不存在则创建
        if (!parentDirectory.exists()) {
            parentDirectory.mkdirs();
        }

        // 检查数据库文件是否存在，如果不存在则创建
        if (!database.exists()) {
            try {
                database.createNewFile();
            } catch (Exception e) {
                // 打印异常信息
                e.printStackTrace();
            }
        }
    }

    @Override
    public String getDatabaseInfo() {
        return database.getAbsolutePath();
    }

    @Override
    public void addNew(Staff staff) {
        // 获取所有员工信息列表
        List<Staff> staffList = findAll();
        // 将新员工信息添加到列表中
        staffList.add(staff);
        // 将更新后的员工信息列表写入到数据源
        writeAll(staffList);
    }


    @Override
    public void deleteById(String id) {
        System.out.println("StaffDaoImpl.deleteById");
    }

    @Override
    public void updateById(Staff staff) {
        System.out.println("StaffDaoImpl.updateById");
    }

    @Override
    public Staff findById(String id) {
        // 遍历所有员工以查找特定ID的员工
        for (Staff s : findAll()) {
            // 检查当前员工的ID是否与给定ID相等
            if (s.getId().equals(id)) {
                // 如果找到匹配的员工，返回该员工对象
                return s;
            }
        }
        // 如果没有找到匹配的员工，返回null
        return null;
    }

    @Override
    public List<Staff> findAll() {
        // 初始化一个空列表用于存储员工对象
        List<Staff> staffList = new ArrayList<>();

        // 尝试读取数据库文件，逐行解析员工对象
        try {
            // 创建 BufferedReader 读取文件
            BufferedReader reader = new BufferedReader(new FileReader(database));
            String line;
            // 逐行读取文件内容直到结束
            while ((line = reader.readLine()) != null) {
                // 解析当前行字符串为员工对象
                Staff staff = parseString(line);
                // 如果解析得到的员工对象不为空，则添加到列表中
                if (staff != null) {
                    staffList.add(staff);
                }
            }

            // 关闭 BufferedReader
            reader.close();
        } catch (IOException e) {
            // 如果发生 IO 异常，打印堆栈信息
            e.printStackTrace();
        }

        // 返回员工对象列表
        return staffList;
    }


    /**
     * 解析字符串以创建Staff对象
     * 该方法用于从给定的字符串中解析出Staff对象的各个属性字符串应以逗号分隔，并包含恰好8个字段
     *
     * @param line 待解析的字符串，包含Staff对象的所有属性，属性之间以逗号分隔
     * @return 如果解析成功，则返回Staff对象；如果解析失败（例如，列数不为8），则返回null
     */
    private Staff parseString(String line) {
        // 分割字符串以获取各个列
        String[] cols = line.split(",");
        // 检查列数是否符合预期
        if (cols.length != 8) {
            // 如果解析出的列数不等于8，则返回null表示解析失败
            return null;
        }
        // 解析并创建Staff对象
        Staff staff = new Staff(
                cols[0],  // ID
                cols[1],  // 姓名
                Integer.parseInt(cols[2]),  // 性别
                LocalDate.parse(cols[3]),  // 出生日期
                cols[4],  // 联系电话
                cols[5],  // 电子邮箱
                cols[6],  // 家庭住址
                Integer.parseInt(cols[7])  // 状态
        );
        return staff;
    }

    /**
     * 将所有员工信息写入数据库文件
     * 该方法通过遍历员工列表，将每个员工的信息转换为CSV格式的字符串，并写入到数据库文件中
     *
     * @param staffList 员工列表，包含所有待写入的员工对象
     */
    private void writeAll(List<Staff> staffList) {
        try {
            // 创建PrintWriter对象用于写入数据库文件
            PrintWriter writer = new PrintWriter(new FileWriter(database));

            // 遍历员工列表，将每个员工的信息转换为CSV格式的字符串并写入文件
            staffList.forEach(s -> {
                // 使用逗号分隔员工信息，生成CSV格式的字符串
                String csvLine = String.join(",",
                        s.getId(),
                        s.getName(),
                        String.valueOf(s.getGender()),
                        s.getDayOfBirth().toString(),
                        s.getPhone(),
                        s.getEmail(),
                        s.getAddress(),
                        String.valueOf(s.getStatus())
                );
                // 将CSV格式的字符串写入文件
                writer.println(csvLine);
            });

            // 关闭PrintWriter对象
            writer.close();
        } catch (IOException e) {
            // 打印异常信息
            e.printStackTrace();
        }
    }

}
